LL_HRTIM_Init and LL_HRTIM_DeInit APIs migration

The LL initialization and de-initialization functions previously available in the stm32tnxx_ll_hrtim.c files within HAL1 are no longer present in HAL2. In HAL2, all LL C files ( stm32tnxx_ll_hrtim.c) have been removed, leaving only the LL header files ( stm32tnxx_ll_hrtim.h) that contain static inline functions.

If users need to initialize or de-initialize HRTIM using the LL layer, they have two methods:

  • Utilize STM32CubeMX2 Code Generation: Rely on STM32CubeMX2 to generate code with the LL layer for HRTIM initialization and de-initialization.

  • Replace manually the initialization and de-initialization functionsReplace the LL_HRTIM_Init and LL_HRIIM_DeInit functions

    manually with equivalent sequences using the static inline functions provided in the stm32tnxx_ll_hrtim.h file, tailored to their specific configuration and requirements.

This approach ensures that the initialization and de-initialization sequences are precisely addressing the given use case based on the LL static inline functions provided in the stm32tnxx_ll_hrtim.h header file. The sequences offer improved footprint optimization compared to the previous LL initialization functions found in stm32tnxx_ll_hrtim.c.

Related concept: Remove stm32tnxx_ll_ppp.c files

Method 1: Utilize STM32CubeMX2 Code Generation

LL HRTIM configuration panel

Create a new project with the STM32CubeMX2, then start the initialization and the main configuration.

Project configuration panel

LL HRTIM main features configuration

Configure the HRTIM main features.

HRTIM main feature configuration

LL HRTIM channels configuration

Enable and configure the chosen HRTIM channel.

HRTIM channels configuration

LL HRTIM advanced features configuration

Configure the advanced HRTIM features.

HRTIM advanced feature configuration

GPIO configuration

Configure GPIO pins.

HRTIM GPIO configuration

Note

The HRTIM GPIO configuration is applicable only if a channel is activated.

DMA configuration

Configure the DMA for data reception as needed.

HRTIM DMA configuration

Note

The HRTIM DMA configuration is applicable only if a timer is activated.

NVIC configuration

Configure the NVIC in case of an interrupt.

HRTIM NVIC configuration

Generated HRTIM initialization sequence

STM32CubeMX2 Generated : HRTIM initialization sequence

HAL1

HAL2

Initialization and configuration sequence

static void MX_HRTIM_Init(void)
{

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  LL_RCC_SetHRTIMClockSource(LL_RCC_HRTIM_CLKSOURCE_TIM);

  /* Peripheral clock enable */
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_HRTIM);

  LL_DMA_SetPeriphRequest(DMA1, LL_DMA_STREAM_0, LL_DMAMUX1_REQ_HRTIM_TIMER_A);

  LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_STREAM_0, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);

  LL_DMA_SetStreamPriorityLevel(DMA1, LL_DMA_STREAM_0, LL_DMA_PRIORITY_LOW);

  LL_DMA_SetMode(DMA1, LL_DMA_STREAM_0, LL_DMA_MODE_NORMAL);

  LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_STREAM_0, LL_DMA_PERIPH_NOINCREMENT);

  LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_STREAM_0, LL_DMA_MEMORY_INCREMENT);

  LL_DMA_SetPeriphSize(DMA1, LL_DMA_STREAM_0, LL_DMA_PDATAALIGN_BYTE);

  LL_DMA_SetMemorySize(DMA1, LL_DMA_STREAM_0, LL_DMA_MDATAALIGN_BYTE);

  LL_DMA_DisableFifoMode(DMA1, LL_DMA_STREAM_0);

  /* HRTIM interrupt Init */
  NVIC_SetPriority(HRTIM1_TIMA_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
  NVIC_EnableIRQ(HRTIM1_TIMA_IRQn);

  LL_HRTIM_TIM_SetPrescaler(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_PRESCALERRATIO_DIV1);
  LL_HRTIM_TIM_SetCounterMode(HRTIM1, LL_HRTIM_TIMER_A, LL_HRTIM_MODE_CONTINUOUS);
  LL_HRTIM_TIM_SetPeriod(HRTIM1, LL_HRTIM_TIMER_A, 0xFFFD);
  LL_HRTIM_TIM_SetRepetition(HRTIM1, LL_HRTIM_TIMER_A, 0x00);

  LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOC);
  /**HRTIM GPIO Configuration
  PC6   ------> HRTIM_CHA1
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_6;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}
HRTIM_TypeDef *mx_hrtim1_init(void)
{
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_HRTIM1);

  /* HRTIM output channels configuration */
  LL_HRTIM_OUT_SetOutputSetSrc(HRTIM1, LL_HRTIM_OUTPUT_CHA1, LL_HRTIM_OUTPUTSET_NONE);
  LL_HRTIM_OUT_SetOutputResetSrc(HRTIM1, LL_HRTIM_OUTPUT_CHA1, LL_HRTIM_OUTPUTRESET_NONE);
  LL_HRTIM_OUT_SetPolarity(HRTIM1, LL_HRTIM_OUTPUT_CHA1, LL_HRTIM_OUT_POSITIVE_POLARITY);
  LL_HRTIM_OUT_SetIdleLevel(HRTIM1, LL_HRTIM_OUTPUT_CHA1, LL_HRTIM_OUT_IDLELEVEL_INACTIVE);
  LL_HRTIM_OUT_SetFaultState(HRTIM1, LL_HRTIM_OUTPUT_CHA1, LL_HRTIM_OUT_FAULTSTATE_ACTIVE);

  /* Timer A configuration */
  LL_HRTIM_TIM_SetPrescaler(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_PRESCALERRATIO_DIV1);
  LL_HRTIM_TIM_SetPeriod(HRTIM1, LL_HRTIM_TIMA, 65503);
  LL_HRTIM_TIM_SetRepetition(HRTIM1, LL_HRTIM_TIMA, 0);
  LL_HRTIM_TIM_SetCounterMode(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_MODE_CONTINUOUS);
  LL_HRTIM_TIM_SetCountingMode(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_COUNTING_MODE_UP);

  LL_HRTIM_TIM_SetUpdateGating(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_UPDATEGAT_INDEPENDENT);
  LL_HRTIM_TIM_SetResetTrig(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_RESETTRIG_NONE);
  LL_HRTIM_TIM_SetInterleavedMode(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_INTERLEAVED_MODE_DISABLE);
  LL_HRTIM_TIM_SetBurstModeOption(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_BURSTMODE_MAINTAINCLOCK);
  LL_HRTIM_OUT_SetIdleMode(HRTIM1, LL_HRTIM_OUTPUT_CHA1, LL_HRTIM_OUT_IDLE_WHEN_BURST);
  LL_HRTIM_OUT_SetBMEntryMode(HRTIM1, LL_HRTIM_OUTPUT_CHA1, LL_HRTIM_OUT_BM_ENTRYMODE_REGULAR);
  LL_HRTIM_OUT_SetIdleMode(HRTIM1, LL_HRTIM_OUTPUT_CHA2, LL_HRTIM_OUT_IDLE_WHEN_BURST);
  LL_HRTIM_OUT_SetBMEntryMode(HRTIM1, LL_HRTIM_OUTPUT_CHA2, LL_HRTIM_OUT_BM_ENTRYMODE_REGULAR);
  LL_HRTIM_TIM_SetComp1Mode(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_GTCMP1_EQUAL);
  LL_HRTIM_TIM_SetTriggeredHalfMode(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_TRIGHALF_DISABLE);
  LL_HRTIM_TIM_SetCompareMode(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_COMPARE_UNIT_2, LL_HRTIM_COMPAREMODE_REGULAR);
  LL_HRTIM_TIM_SetComp3Mode(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_GTCMP3_EQUAL);
  LL_HRTIM_TIM_SetCompareMode(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_COMPARE_UNIT_4, LL_HRTIM_COMPAREMODE_REGULAR);
  LL_HRTIM_TIM_SetCompareValue(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_COMPARE_UNIT_1, 0);
  LL_HRTIM_TIM_SetCompareValue(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_COMPARE_UNIT_2, 0);
  LL_HRTIM_TIM_SetCompareValue(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_COMPARE_UNIT_3, 0);
  LL_HRTIM_TIM_SetCompareValue(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_COMPARE_UNIT_4, 0);

  LL_HRTIM_TIM_SetCaptureTrig(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_CAPTURE_UNIT_1, LL_HRTIM_CAPTURETRIG_NONE);
  LL_HRTIM_TIM_SetCaptureTrig(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_CAPTURE_UNIT_2, LL_HRTIM_CAPTURETRIG_NONE);
  LL_HRTIM_TIM_SetDACTrig(HRTIM1, LL_HRTIM_TIMA, LL_HRTIM_DACTRIG_NONE);

    /* GPIO Clocks activation */
  LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOC);

  /**
    HRTIM1 GPIO Configuration

    [GPIO Pin] ------> [Signal Name]

       PC6     ------>   HRTIM1_CHA1
    **/

  /* Configure IO output speed (Low, Medium, High or Very-High) */
  LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_6, LL_GPIO_SPEED_FREQ_LOW);

  /* Configure IO output type (Push-Pull or Open-Drain) */
  LL_GPIO_SetPinOutputType(GPIOC, LL_GPIO_PIN_6, LL_GPIO_OUTPUT_PUSHPULL);

  /* Activate the Pull-up, Pull-down resistor, or No pull for the current IO */
  LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_6, LL_GPIO_PULL_NO);

  /* Configure the Alternate Function in current IO */
  LL_GPIO_SetAFPin_0_7(GPIOC, LL_GPIO_PIN_6, LL_GPIO_AF_4);

  /* Configure IO direction mode (Input, Output, Alternate or Analog) */
  LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_6, LL_GPIO_MODE_ALTERNATE);

  /* Enable HRTIM fault interrupt */
  NVIC_SetPriority(HRTIM1_FLT_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0));
  NVIC_EnableIRQ(HRTIM1_FLT_IRQn);

  return HRTIM1;
}

Deinitialization sequence

static void MX_HRTIM1_DeInit(void)
{
  LL_HRTIM_DeInit(&hHRTIM1)
}
void mx_hrtim1_deinit(void)
{
  LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_HRTIM1);

  LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_HRTIM1);
  LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_HRTIM1);

  /* ### GPIO deinitialization of HRTIM1: HRTIM1_CHA1 ########################### */

  /* Configure IO in Analog Mode */
  LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_6, LL_GPIO_MODE_ANALOG);

  /* Configure the default Alternate Function in current IO */
  LL_GPIO_SetAFPin_0_7(GPIOC, LL_GPIO_PIN_6, LL_GPIO_AF_0);

  /* Configure the default value for IO Speed */
  LL_GPIO_SetPinSpeed(GPIOC, LL_GPIO_PIN_6, LL_GPIO_SPEED_FREQ_LOW);

  /* Configure the default value IO Output Type */
  LL_GPIO_SetPinOutputType(GPIOC, LL_GPIO_PIN_6, LL_GPIO_OUTPUT_PUSHPULL);

  /* Deactivate the Pull-up and Pull-down resistor for the current IO */
  LL_GPIO_SetPinPull(GPIOC, LL_GPIO_PIN_6, LL_GPIO_PULL_NO);

  /* Reset the IO output state */
  LL_GPIO_WriteOutputPin(GPIOC, LL_GPIO_PIN_6, LL_GPIO_PIN_RESET);

  LL_GPIO_DisableHighSpeedLowVoltage(GPIOC, LL_GPIO_PIN_6);

  /* Disable HRTIM fault interrupt */
  NVIC_DisableIRQ(HRTIM1_FLT_IRQn);
}

Method 2: Replace manually the de-initialization functions

LL_HRTIM_DeInit() API migration

Note

For other HRTIM instances and/or series, modify the LL_APBx_GRPx and LL_APBx_GRPx defines as needed according to the target series.

Comparison of HAL1 and HAL2

HAL1

HAL2

Case of HRTIM

LL_HRTIM_DeInit(&HRTIM1);
LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_HRTIM1);
LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_HRTIM1);